package info.liuxing.config;

import info.liuxing.bean.Car;
import info.liuxing.bean.Cat;
import info.liuxing.bean.Dog;
import info.liuxing.bean.MyBeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * bean的生命周期
 *      bean创建---初始化---销毁的过程
 * <p>
 * 容器管理bean的生命周期
 *      我们可以自定义初始化和销毁方法，容器在bean进行到当前生命周期的时候来调用
 *      我们自定义的初始化和销毁方法
 * <p>
 * 构造（对象创建）
 *      单实例：在容器启动的时候创建对象
 *      多实例：在每次获取的时候创建对象
 * <p>
 * 初始化
 *      postProcessBeforeInitialization: 初始化之前进行后置处理工作
 *      对象创建完成，并赋值好，调用初始化方法
 *      postProcessAfterInitialization: 初始化之后进行后置处理工作
 * <p>
 * 销毁
 *      单实例：容器关闭时销毁
 * 		多实例：容器不管理bean，自行处理
 * <p>
 * 1、指定初始化和销毁方法
 *      xml中可以通过init-method和destroy-method来指定方法
 *      @Bean(initMethod = "init", destroyMethod = "destroy")
 * 2、实现InitializingBean(定义初始化逻辑)
 *    实现DisposableBean(定义销毁逻辑)
 * 3、使用JSR250
 *      @PostConstruct：在bean创建完成且属性赋值完成，来执行初始化
 * 	    @PreDestroy：在容器销毁bean之前回调注解的方法
 * 4、BeanPostProcessor: bean后置处理器
 * 	    在bean初始化前后进行一些处理工作
 * 	    postProcessBeforeInitialization: 初始化之前进行后置处理工作
 * 	    postProcessAfterInitialization: 初始化之后进行后置处理工作
 * 	    流程: 构造 -> postProcessBeforeInitialization -> init -> postProcessAfterInitialization
 *
 * Spring底层对BeanPostProcessor的使用
 *      bean赋值、注入其他组件、@Autowired、生命周期注解功能、@Async等
 *      更多实现类查看BeanPostProcessor的实现类
 *      注意类名为xxxBeanPostProcessor的类
 */
@Configuration
public class MainConfigOfLifeCycle {

//    @Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Car car() {
        return new Car();
    }

    @Bean
    public Cat cat() {
        return new Cat();
    }

    @Bean
    public Dog dog() {
        return new Dog();
    }

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor() {
        return new MyBeanPostProcessor();
    }

}
